package com.qfedu.edu.queuemonitorservice.job;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.qfedu.edu.constance.RabbitMQConstance;
import com.qfedu.edu.queuemonitorservice.properties.QueueParamsProperties;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @author xiaobobo
 * @title: MySimpleJob
 * @projectName seckill-fy-2401-parent
 * @description: TODO
 * @date 2024/11/18  10:50
 */
@Component
@Slf4j
@EnableConfigurationProperties(QueueParamsProperties.class)
public class MySimpleJob implements SimpleJob {

    @Autowired
    private Channel channel;

    @Autowired
    private QueueParamsProperties queueParamsProperties;

    @Override
    public void execute(ShardingContext shardingContext) {
        //首先获取所有队列名字的数组
        String[] queueNamesArray = RabbitMQConstance.getQueueNames();
        for (int i = 0; i <queueNamesArray.length ; i++) {
            //找到队列的名字
            String queueName = queueNamesArray[i];
            //通过通道 去获取 当前队列中消息的个数 以及消费者的数量
            AMQP.Queue.DeclareOk declareOk = null;
            try {
                declareOk = channel.queueDeclarePassive(queueName);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            //获取队列中消息的个数
            int messageCount = declareOk.getMessageCount();
            //获取对象当前的消费者的数量
            int consumerCount = declareOk.getConsumerCount();
            log.info("队列{}中消息的个数是:",queueName,messageCount);
            log.info("队列{}中消费者的个数:",queueName,consumerCount);
            if(messageCount>=queueParamsProperties.getLimit()){
                //说明队列中消息的积压个数  已经达到了指定阈值以上
                //那么这里就要通知运维...
                //TODO 系统需要预警的
                log.error("队列{}消息的个数{}已经达到了指定的阈值、请做好预防",queueName,messageCount);
            }
            if(consumerCount==0){
                //说明消费者的服务死了 那么需要预警运维去进行消费者服务的重启
                log.error("队列:{}没有消费者了，请检查系统是否还正常运行",queueName);
            }
        }

    }
}
